package jee.boot.module.mail;

import jee.boot.entity.mail.Mail;
import jee.boot.module.mail.interceptor.DefaultMailPostInterceptor;
import jee.boot.module.mail.interceptor.DefaultMailPreInterceptor;
import jee.boot.module.mail.queue.MailProducer;
import jee.boot.module.mail.sender.MailTaskHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * <p>邮件服务调用接口</p>
 * <pre>
 *     邮件请求的参数格式参考 {@link Mail}
 *     String fromMail;发送人:不需要设定,后台会从配置文件中读取
 *     String toMail;收件人:多个收信人用";"隔开 必填
 *     String ccMail;抄送人:多个收信人用";"隔开 选填
 *     String bccMail;暗送人:多个收信人用";"隔开 选填
 *     Date sentDate;发送时间:不需要设定,后台自动填充
 *     String subject;主题 必填
 *     String text;邮件内容 :内容可以为文本或者html格式等数据,如果设定了邮件模板,则会忽略当前设定的邮件内容
 *     String sendStatus;发送状态:后台根据发送结果填充,不需要指定
 *     String message;发送信息:后台根据发送结果填充,不需要指定
 *     Operator sendUser;发送人:后台根据发送结果填充,不需要指定
 *     List<File> attachmentList=new ArrayList<>();附件:发送后附件文件不进行数据库存储,选填
 *     String templateName;邮件是否使用的模板(选填),如果使用了模板会根据模板生成新的text覆盖到当前text,因此设定了templateName就不需要设定text了,模板需要在/src/resources/templates/下定义的*.ftl文件,参考test.ftl
 *     Map<String,Object> data;邮件使用模板时候使用的(选填)
 *     boolean asyn=true;默认异步发送, asyn=true(默认)通过mq的队列进行排队发送,asyn=false不需要排队,直接发送邮件
 *
 *     日历邮件专属属性
 *     String location:日历邮件地点
 *     String startDateTime:日历邮件开始时间
 *     String endDateTime:日历邮件结束时间
 * </pre>
 *
 * <pre>
 *     1.邮件后端代码调用方式
 *         @ Autowired
 *         private SendMailHelper helper;
 *         {
 *           Mail entity=new Mail()
 *           entity.set...... 设置邮件的相关信息
 *           //异步邮件,经过mq后排队发送
 *           helper.sendMailAsyn(entity);
 *           // 同步邮件,直接发送
 *           helper.sendMailSync(entity);
 *           // 同步发送日历邮件
 *           helper.sendCalendarMailSync(entity);
 *         }
 * </pre>
 * <pre>
 *     2.邮件前端api调用方式
 *      post /api/system/mail/send
 *      {
 * 	        "toMail":"12345678@qq.com",
 * 	        "ccMail":"87654321@qq.com",
 * 	        "subject":"测试邮件主题12345",
 * 	        "text":"邮件内容12345",
 * 	        "templateName":"test.ftl",
 * 	        "data":{
 * 		        "title":"这个是邮件内容的标题",
 * 		        "content":"哈哈"
 *            }
 *       }
 * </pre>
 * <pre>
 *     2.日历邮件前端api调用方式
 *      post /api/system/mail/sendCalendarMail
 *      {
 * 	        "toMail":"12345678@qq.com",
 * 	        "ccMail":"87654321@qq.com",
 * 	        "subject":"测试邮件主题12345",
 * 	        "text":"邮件内容12345",
 * 	        "location":"会议室01",
 * 	        "startDateTime":"2019-11-11 12:00:00",
 * 	        "endDateTime":"2019-11-11 14:00:00"
 *       }
 * </pre>
 * <pre>
 *     3.历史邮件追踪
 *     提供标准的邮件模块增删改查接口,如下
 *     post /api/system/mail/list
 *     post /api/system/mail/get
 *     post /api/system/mail/delete
 *     'system'需要替换成自己的service模块前缀
 * </pre>
 * <pre>
 *     4.拓展支持
 *     后端提供对邮件发送前,后的附件处理支持,目前
 *     默认的前置处理为{@link DefaultMailPreInterceptor} : 功能为设置默认数据,并解析模板(如果使用)
 *     默认的后置处理为{@link DefaultMailPostInterceptor} :功能为邮件发送后,本地留存邮件记录
 *     developer可以根据自己的需要来定制自己的前后置处理器,参考
 *      @ Component
 *      public class MailConfigNew {
 *
 *           @ Autowired
 *           private PrintMailPostInterceptor printMailPostInterceptor;
 *           @ Autowired
 *           private MailTaskHandler taskHandler;
 *
 *           @ PostConstruct
 *          public void customerMailTaskHandler() {
 *               taskHandler.addPostInterceptor(printMailPostInterceptor);// 自定义的邮件后置处理器
 *
 *           }
 *       }
 *       </code>
 * </pre>
 * <pre>
 *     5.application.yml增加配置
 *       ####################邮箱配置#################
 * spring:
 *   mail:
 *     host: smtp.163.com
 *     username: redf2000@163.com
 *     #邮箱的授权码
 *     password: Authorization123
 *     default-encoding: UTF-8
 *     properties:
 *       mail:
 *         smtp:
 *           auth: true
 *           starttls:
 *             enable: true
 *             required: true
 *   ####################freemarker配置##################
 *   freemarker:
 *     content-type: text/html
 *     #后缀名
 *     suffix: .ftl
 *     template-loader-path: classpath:/templates
 *     charset: UTF-8
 *     check-template-location: true
 *   # 消息队列 activemq
 *   activemq:
 *     broker-url: tcp://39.97.176.59:61616
 *     user: admin
 *     password: admin
 *     in-memory: true
 *     pool:
 *       enabled: false
 * </pre>
 */
@Component
public class SendMailHelper {
    @Autowired
    private MailProducer producer;// 邮件队列(用于异步发送)
    @Autowired
    private MailTaskHandler sender;//邮件发送接口(用于同步发送)

    /**
     * 同步发送邮件
     */
    public void sendMailSync(Mail mail){
        sender.send(mail);
    }

    /**
     * 异步发送邮件
     */
    public void sendMailAsyn(Mail mail){
        producer.send(mail);
    }

    /**
     * 同步邮件,直接发送日历类邮件
     * @param mail
     */
    public void sendCalendarMailSync(Mail mail) {
        sender.sendCalendarMail(mail);
    }
}
